package com.fx.spring.controller;

import com.fx.spring.util.FxmlLoaderUtil;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class AbstractController<R> implements Initializable {
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    protected R root;
    private String fxmlPath;
    private FXMLLoader loader;

    /**
     * 调用此方法时，还没有调用JavaFX 的 init方法
     *
     * @param fxmlPath fxml路径
     **/
    public void setFxmlLoader(String fxmlPath) {
        this.fxmlPath = fxmlPath;
    }

    /**
     * 单例加载FXML 文件
     *
     * @return 加载并返回根节点（如果已经加载则直接返回根节点）
     */
    public R load() {
        beforeLoad();
        if (root == null) {
            this.loader = FxmlLoaderUtil.getFxmlLoader(null);
            this.root = FxmlLoaderUtil.load(loader, fxmlPath);
        }
        afterLoad();
        return this.root;
    }

    /**
     * 多例加载 FXML
     *
     * @param controller 控制层
     * @return 加载并返回根节点（如果已经加载则直接返回根节点）
     */
    public R load(Object controller) {
        beforeLoad();
        this.loader = FxmlLoaderUtil.getFxmlLoader(controller);
        this.root = FxmlLoaderUtil.load(loader, fxmlPath);
        afterLoad();
        return this.root;
    }

    /**
     * 获取 FXMLLoader
     *
     * @return 返回 FXMLLoader
     */
    public FXMLLoader getLoader() {
        return this.loader;
    }

    /**
     * 加载之前
     */
    protected void beforeLoad() {
    }

    /**
     * 加载之后
     */
    protected void afterLoad() {
    }


}
